package com.example.mybatisdemo2.mapper;

import com.example.mybatisdemo2.model.UserInfo;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
//这个注解是说明将这个接口交给spring来管理
//这个注解是必须的,否则无法使用后续的xml调用
public interface UserInfoMapper {
    //注解类型的共同代码,提取(也是第二种里面的)
    @ResultMap("BaseMap")
    @Select("select * from userinfo2")
    List<UserInfo> queryUserInfos6();


    //查询
    @Select("select * from userinfo2")
    List<UserInfo> queryUserInfos();

    @Select("select  * from  userinfo2 where id=#{id}")
    List<UserInfo> queryUserInfos2(@Param("id")Integer id);

    //使用${}进行赋值
    @Select("select  * from  userinfo2 where id=${id}")
    List<UserInfo> queryUserInfos8(@Param("id")Integer id);

    //使用$传递字符串是没有引号的
    @Select("select  * from  userinfo2 where username='${username}'")
    List<UserInfo> queryUserInfos9(@Param("username")String username);


    @Select("select  * from  userinfo2 where id=#{id} and username=#{name}")
    List<UserInfo> queryUserInfos3(@Param("id")Integer id,@Param("name")String username);

    //查询对象映射
    //1.起别名
    @Select("select id, username, password, age, create_time as createTime, update_time as updateTime" +
            " from userinfo2")
    List<UserInfo> queryUserInfos4();

    //2.注解,定义结果映射 配置字段和属性的关系,column是字段,property是对应的属性
    @Results(id = "BaseMap",value = {
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")
    })
    @Select("select * from userinfo2")
    List<UserInfo> queryUserInfos5();

    //3.配置(修改xml)
    @Select("select * from userinfo2")
    List<UserInfo> queryUserInfos7();


    //插入
    @Insert("insert into userinfo2 (username,password,age) " +
            "values (#{username},#{password},#{age})")
    //#{} 的名字,要能对应上设置的对象的各种参数信息,要能够赋值
    //上面()中的信息要和sql中的字段名称能够对应,同时下面的参数名称也要和上面的字段名称对应
    Integer insert(UserInfo userInfo);

    //获取自增id
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into userinfo2 (username,password,age) " +
            "values (#{userinfo.username},#{userinfo.password},#{userinfo.age})")
    Integer insert2(@Param("userinfo") UserInfo userInfo);


    //删
    @Delete("delete from userinfo2 where id=#{id}")
    Integer Delete(@Param("id") Integer id);


    //更新
    @Update("update userinfo2 set password =#{userinfo.password} where id = #{userinfo.id}")
    Integer Update(@Param("userinfo") UserInfo userInfo);


    //演示SQL注入
    @Select("select  * from userinfo2 where username=#{username} and password = #{password}")
    List<UserInfo> queryUserByNameAndPassword(@Param("username") String username,@Param("password") String password);
    @Select("select  * from userinfo2 where username='${username}' and password = '${password}'")
    List<UserInfo> queryUserByNameAndPassword2(@Param("username") String username,@Param("password") String password);


    //排序 降序(desc) 升序(asc)
    //使用#{} 会自动添加 '' 让语句出现错误
    @Select("select * from userinfo2 order by id #{order}")
    List<UserInfo> queryUserInfoByOrder(@Param("order") String order);
    //使用${} 此时就需要使用中国,因为要传输的参数是SQL语句的一部分,而且不是查询字符串
    @Select("select * from userinfo2 order by id ${order}")
    List<UserInfo> queryUserInfoByOrder2(@Param("order") String order);


    //模糊查询
    //CONCAT 字符串拼接
    @Select("select * from userinfo2 where username like CONCAT('%',#{name},'%')")
    List<UserInfo> queryUserInfoByLike(@Param("name") String name);
}
